'use strict';

const _           = require('lodash');
const error       = require('../error');
const definitions = require('../../schema/definitions.json');

RegExp.prototype.toJSON = RegExp.prototype.toString;

const ajv = require('ajv')({
    verbose:     true, //process.env.NODE_ENV === 'development',
    allErrors:   true,
    format:      'full',  // strict regexes for format checks
    coerceTypes: true,
    schemas:     [
        definitions
    ]
});

/**
 *
 * @param {Object} schema
 * @param {Object} payload
 * @returns {Promise}
 */
function validator (schema, payload) {
    return new Promise(function (resolve, reject) {
        if (!payload) {
            reject(new error.InternalValidationError('Payload is falsy'));
        } else {
            try {
                let validate = ajv.compile(schema);

                let valid = validate(payload);
                if (valid && !validate.errors) {
                    resolve(_.cloneDeep(payload));
                } else {
                    console.log('SCHEMA:', schema);
                    console.log('PAYLOAD:', payload);

                    let message = ajv.errorsText(validate.errors);
                    reject(new error.InternalValidationError(message));
                }

            } catch (err) {
                reject(err);
            }

        }

    });

}

module.exports = validator;
